﻿using System;
using System.Reflection;

namespace RefLib.Branding
{
    internal sealed class ValueFactory
    {
        public static object Build(BrandedObjectDTO item)
        {
            switch (item.TypeName)
            {
                case "System.Boolean":
                    return (item.ContentLength > 0) ? Boolean.Parse(item.SerializedValue) : false;

                case "System.DateTime":
                    return (item.ContentLength > 0) ? DateTime.Parse(item.SerializedValue) : DateTime.Now;

                case "System.Decimal":
                    return (item.ContentLength > 0) ? Decimal.Parse(item.SerializedValue) : Decimal.Zero;

                case "System.Double":
                    return (item.ContentLength > 0) ? Double.Parse(item.SerializedValue) : 0;

                case "System.Int16":
                    return (item.ContentLength > 0) ? Int16.Parse(item.SerializedValue) : 0;

                case "System.Int32":
                    return (item.ContentLength > 0) ? Int32.Parse(item.SerializedValue) : 0;

                case "System.Int64":
                    return (item.ContentLength > 0) ? Int64.Parse(item.SerializedValue) : 0;

                case "System.Single":
                    return (item.ContentLength > 0) ? Single.Parse(item.SerializedValue) : 0;

                case "System.String":
                    return (item.ContentLength > 0) ? item.SerializedValue : String.Empty;

                case "System.TimeSpan":
                    return (item.ContentLength > 0) ? TimeSpan.Parse(item.SerializedValue) : TimeSpan.Zero;

                case "System.UInt16":
                    return (item.ContentLength > 0) ? UInt16.Parse(item.SerializedValue) : 0;

                case "System.UInt32":
                    return (item.ContentLength > 0) ? UInt32.Parse(item.SerializedValue) : 0;

                case "System.UInt64":
                    return (item.ContentLength > 0) ? UInt64.Parse(item.SerializedValue) : 0;
            }

            string[] typeParts = item.TypeName.Split(',');
            string assemblyName = (typeParts.Length == 2) ? typeParts[0] : "mscorlib";
            string typeName = typeParts[(typeParts.Length == 2) ? 1 : 0];

            Assembly assembly = Assembly.Load(assemblyName);
            Type type = assembly.GetType(typeName);

            if (item.ContentLength == 0)
                return Activator.CreateInstance(type);

            if (type.IsEnum)
                return Enum.Parse(type, item.SerializedValue, true);

            return Activator.CreateInstance(type, new object[] { item.SerializedValue });
        }

        private ValueFactory() { }
    }
}
